#
# Copyright (C) 2021 by Intel Corporation
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#

	.intel_syntax noprefix

	.globl _avx2_compress
	.globl avx2_compress

	# uint64_t avx2_compress(uint32_t *out, const uint32_t *in, uint64_t len)
	# On entry:
	#     rdi = out
	#     rsi = in
	#     rdx = len

	# On exit
	#     rax = out_len

	.text

_avx2_compress:
avx2_compress:

	push r13
	push r14
	push r15
	                                   # mov rsi, source
	                                   # mov rdi, dest
	mov r9, rdx                        # mov r9, len
	lea r14, shuffle_LUT[rip]          # mov r14, shuffle_LUT
	lea r15, write_mask[rip]           # mov r15, write_mask

	xor r8, r8
	xor r11, r11
	vpxor ymm0, ymm0, ymm0

mainloop:
	vmovdqa ymm1, [rsi+r8*4]
	vpcmpgtd ymm2, ymm1, ymm0
	mov r10, 8
	vmovmskps r13, ymm2
	shl r13, 5
	vmovdqu ymm3, [r14+r13]
	vpermd ymm2, ymm3, ymm1
	popcnt r13, r13
	sub r10, r13
	vmovdqu ymm3, [r15+r10*4]
	vmaskmovps [rdi+r11*4], ymm3, ymm2
	add r11, r13
	add r8, 8
	cmp r8, r9
	jne mainloop

	vzeroupper

	pop r15
	pop r14
	pop r13

	mov rax, r11

	ret

#ifdef __APPLE__
	.section __TEXT,__const
#else
	.section .rodata
#endif
	.p2align 5

shuffle_LUT:
	.int 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0
	.int 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0
	.int 0x3, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0
	.int 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x5, 0x0, 0x0, 0x0
	.int 0x4, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x5, 0x0, 0x0, 0x0
	.int 0x3, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x5, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x0, 0x0
	.int 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x6, 0x0, 0x0, 0x0
	.int 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x6, 0x0, 0x0, 0x0
	.int 0x3, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x6, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x6, 0x0, 0x0
	.int 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x3, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x5, 0x6, 0x0, 0x0
	.int 0x4, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x5, 0x6, 0x0, 0x0
	.int 0x3, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x0
	.int 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x3, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x7, 0x0, 0x0, 0x0
	.int 0x4, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x7, 0x0, 0x0, 0x0
	.int 0x3, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, 0x0, 0x0
	.int 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x3, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x5, 0x7, 0x0, 0x0
	.int 0x4, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x5, 0x7, 0x0, 0x0
	.int 0x3, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x5, 0x7, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x7, 0x0
	.int 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x2, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x3, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x6, 0x7, 0x0, 0x0
	.int 0x4, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x6, 0x7, 0x0, 0x0
	.int 0x3, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0
	.int 0x2, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x6, 0x7, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x6, 0x7, 0x0
	.int 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x1, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x2, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x2, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x3, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x2, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x1, 0x2, 0x3, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x5, 0x6, 0x7, 0x0
	.int 0x4, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0, 0x0
	.int 0x0, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x1, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x1, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x2, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x2, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x1, 0x2, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x0, 0x1, 0x2, 0x4, 0x5, 0x6, 0x7, 0x0
	.int 0x3, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0, 0x0
	.int 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x1, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x0, 0x1, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0
	.int 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0, 0x0
	.int 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0
	.int 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0
	.int 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7

write_mask:
	.int 0x80000000, 0x80000000, 0x80000000, 0x80000000
	.int 0x80000000, 0x80000000, 0x80000000, 0x80000000
	.int 0x00000000, 0x00000000, 0x00000000, 0x00000000
	.int 0x00000000, 0x00000000, 0x00000000, 0x00000000

#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
